package com.example.meterialproject.view

import android.content.Context
import android.graphics.Canvas
import android.util.AttributeSet
import android.util.Log
import android.view.View
import com.example.meterialproject.exts.TAG
import com.example.meterialproject.exts.name

/**
 *
 * @ClassName: TestLifeView
 * @Author: android 超级兵
 * @CreateDate: 4/15/22$ 7:28 PM$
 * TODO
 */
class TestLifeView @JvmOverloads constructor(
    context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : View(context, attrs, defStyleAttr) {


    /*
    * 作者:android 超级兵
    * 创建时间: 4/15/22 7:50 PM
    * TODO 1. 当前view在xml中加载完成之后执行, onCreate()#setContentView()方法之前执行
    */
    override fun onFinishInflate() {
        super.onFinishInflate()
        Log.i(TAG, "onFinishInflate")
    }


    /*
     * 作者:android 超级兵
     * 创建时间: 4/15/22 7:56 PM
     * TODO 2. 当view添加到PhoneWindow上时候执行
     *
     * tips: Activity.onResume()方法后执行
     */
    override fun onAttachedToWindow() {
        super.onAttachedToWindow()
        Log.i(TAG, "onAttachedToWindow")
    }


    /*
     * 作者:android 超级兵
     * 创建时间: 4/15/22 7:57 PM
     * TODO 3. 当window可见的时候调用
     */
    override fun onWindowVisibilityChanged(visibility: Int) {
        super.onWindowVisibilityChanged(visibility)
        Log.i(TAG, "onWindowVisibilityChanged visibility:${getVisibilityType(visibility)}")
    }

    /*
     * 作者:android 超级兵
     * 创建时间: 4/15/22 7:58 PM
     * TODO 4. 当判断view是否可见的时候调用 android:visibility="XXX"
     *
     *  tips: 如果visibility == GONE 那么则不会执行
     */
    override fun onVisibilityChanged(changedView: View, visibility: Int) {
        super.onVisibilityChanged(changedView, visibility)
        // VISIBLE = 0,
        // INVISIBLE = 4,
        // GONE = 8
        Log.i(
            TAG,
            "onVisibilityChanged：changedView:${changedView.name}\tvisibility:${
                getVisibilityType(visibility)
            }"
        )
    }


    /*
     * 作者:android 超级兵
     * 创建时间: 4/15/22 8:00 PM
     * TODO 5. 当view可见的时候开始测量view的宽高
     */
    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec)
        Log.i(TAG, "onMeasure")
    }

    /*
     * 作者:android 超级兵
     * 创建时间: 4/15/22 7:12 PM
     * TODO 5. 当onMeasure() 执行完时候执行
     *
     *  @param w: 当前view的 宽
     *  @param h: 当前view的 高
     *  @param oldW: old view的 高
     *  @param oldH: old view的 高
     */
    override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
        super.onSizeChanged(w, h, oldw, oldh)
        Log.i(
            TAG, "temp onSizeChanged newW:${w}" +
                    "\tnewH:${h}" +
                    "\toldW:$oldw" +
                    "\toldH:$oldh"
        )
    }

    /*
     * 作者:android 超级兵
     * 创建时间: 4/15/22 8:04 PM
     * TODO 7. 布局
     */
    override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
        super.onLayout(changed, left, top, right, bottom)
        Log.e(
            TAG, "temp onLayout changed:$changed" +
                    "\tleft:${left}" +
                    "\ttop:${top}" +
                    "\tright:$right" +
                    "\tbottom:$bottom"
        )
    }


    override fun dispatchDraw(canvas: Canvas?) {
        super.dispatchDraw(canvas)
    }
    /*
     * 作者:android 超级兵
     * 创建时间: 4/15/22 8:04 PM
     * TODO 8. 绘制
     */
    override fun onDraw(canvas: Canvas?) {
        super.onDraw(canvas)
        Log.i(TAG, "onDraw")
    }

    /*
     * 作者:android 超级兵
     * 创建时间: 4/15/22 8:05 PM
     * TODO 9. 当 window 焦点发生变化的时候调用
     *
     *  @param hasWindowFocus: 当前window是否有焦点
     */
    override fun onWindowFocusChanged(hasWindowFocus: Boolean) {
        super.onWindowFocusChanged(hasWindowFocus)
        Log.i(TAG, "onWindowFocusChanged hasWindowFocus:${hasWindowFocus}")
    }

    /*
     * 作者:android 超级兵
     * 创建时间: 4/15/22 8:06 PM
     * TODO 当activity.onDestroy() 之后调用,表示当前view销毁
     */
    override fun onDetachedFromWindow() {
        super.onDetachedFromWindow()
        Log.i(TAG, "onDetachedFromWindow")
    }

    /*
     * 作者:android 超级兵
     * 创建时间: 4/15/22 7:48 PM
     * TODO 判断类型
     */
    private fun getVisibilityType(visibility: Int) = let {
        when (visibility) {
            VISIBLE -> {
                "VISIBLE"
            }
            INVISIBLE -> {
                "INVISIBLE"
            }
            GONE -> {
                "GONE"
            }
            else -> "$visibility"
        }
    }
}